package com.juli.school.service.impl;

import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.juli.school.dao.mapper.CidMapper;
import com.juli.school.service.bo.CidBo;
import com.juli.school.service.utils.ImportEntry;
import com.juli.school.service.utils.isBlankUtils;

/**
 * @author wjp
 * @date 2017年7月31日
 */
@Service
public class PoiService {
	
	@Autowired
	private CidMapper cidMapper;
	
	private static int ThreadPoolSize = 3; // 线程池中线程初始数量
	
	private static final ExecutorService fixedThreadPool = Executors.newFixedThreadPool(ThreadPoolSize); // 创建一个线程池
	
	/**
	 * 多线程批量添加数据
	 * 
	 * @param subs
	 * @return
	 */
	public String batchAdd(final List<CidBo> subs) {
		fixedThreadPool.execute(new Runnable() {
			
			public void run() { // 获取一条线程执行
				try {
					for (CidBo cid : subs) {
						// JdbcDao.addcidOfMyPool(cid);
						// cidDao.savecid(cid);
						cidMapper.insert(cid); // 保存
					}
				} catch (Exception e) {
					System.out.println(e.getMessage());
				}
			}
		});
		return "OK";
	}
	
	// 文件导入
	public int importExcel(FileInputStream fis, String fileName) {
		// 获取当前时间毫秒值
		long start = System.currentTimeMillis();
		int length = 0;
		Workbook workbook = null;
		if (isBlankUtils.Validate(fileName, "文件获取失败") == null) {
			return 0;
		}
		try {
			// 判断上传Excel文件的版本
			if (fileName.toLowerCase().endsWith("xlsx")) {
				workbook = new XSSFWorkbook(fis);
			} else if (fileName.toLowerCase().endsWith("xls")) {
				workbook = new HSSFWorkbook(fis);
			}
			// int numberOfSheets = workbook.getNumberOfSheets();
			Sheet sheet = workbook.getSheetAt(0);// 获取Excel表格中第一页
			Iterator<Row> rowIterator = sheet.iterator();// 获取所有上传文件内容，返回一个迭代器
			List<CidBo> arrayList = new ArrayList<CidBo>();// 将迭代器的内容取出存入
			while (rowIterator.hasNext()) {
				CidBo cid = new CidBo();
				Row row = rowIterator.next();
				Iterator<Cell> cellIterator = row.cellIterator();
				while (cellIterator.hasNext()) {
					Cell cell = cellIterator.next();// 获取Excel表格中一行的数据
					if (cell.getRowIndex() > 0) {
						// cell.getColumnIndex()// 获取当期行的写入的列的索引
						switch (cell.getColumnIndex()) {
						case 0:
							cid.setCollId((int) cell.getNumericCellValue());
							break;
						case 1:
							cid.setCollege(cell.getStringCellValue());
							break;
						case 2:
							cid.setDept(cell.getStringCellValue());
							break;
						case 3:
							cid.setMnc((int) cell.getNumericCellValue());
							break;
						case 4:
							try {
								cid.setLac(cell.getStringCellValue());
							} catch (Exception e) {
								cid.setLac(((long) cell.getNumericCellValue()) + "");
							}
							break;
						case 5:
							try {
								cid.setCid(cell.getStringCellValue());// 如果是数字
							} catch (Exception e) {
								cid.setLac(((long) cell.getNumericCellValue()) + "");
							}
							break;
						}
						// int rowIndex = cell.getRowIndex(); // 获取当期操作的是哪一行
						// cell.getNumericCellValue();
						// System.out.println(rowIndex);
					}
					length = cell.getRowIndex();
				}
				if (length > 0) {
					cid.setId(length);
					arrayList.add(cid);
					cid = null;
				}
				if (arrayList.size() >= 2000) {
					System.out.println("==========当前读到第" + length + "行==========");
					List<CidBo> subs = new ArrayList<CidBo>();
					subs.addAll(arrayList); // 使用中间集合过渡集合数据，支持多线程并行执行条件（这样每个线程执行时都是操作唯一的集合，不会有数据混乱问题）
					// batchAdd(subs);//
					// 保存每次读取的二千条数据---异步存储，程序反应快，但是存储慢(10w数据插入时程序运行时间
					// 10s左右，但是数据库数据存完需要2-3分钟)
					ImportEntry.add(subs); // 同步存储，反应慢，但是存储快(10w数据插入时程序运行时间22s左右同时数据库数据存完)
					arrayList.clear(); // 清空上一次二千数据
				}
			}
			if (arrayList.size() > 0) {
				// batchAdd(arrayList);// 如果剩余条数不足二千条时进行剩余保存
				ImportEntry.add(arrayList);
			}
			long end = System.currentTimeMillis();
			System.out.println("一共耗时：" + (end - start) / 1000 + "s");
			return (int) ((end - start) / 1000);
		} catch (Exception e) {
		}
		return 0;
	}
}
